Skip to main content

ArrayDeque

The ArrayDeque Class in Java​

ArrayDeque (Array Double Ended Queue) is a resizable-array implementation of the Deque interface.

It supports insertion and removal of elements from both ends, making it suitable for:

  • Queue (FIFO)
  • Stack (LIFO)
  • Double-ended queue (Deque)

Internally it uses a circular resizable array, which makes it faster and more memory efficient than LinkedList for most operations.


Key Characteristics​

  • Double-Ended Operations -- Insert and remove from both ends
  • Resizable Array -- Automatically grows when needed
  • No Capacity Limit -- Dynamically resizes
  • Not Thread-Safe
  • Better Performance than LinkedList for deque operations
  • No Null Elements Allowed

Common Use Cases​

  • Implementing queues
  • Implementing stacks
  • Sliding window algorithms
  • BFS algorithms
  • General-purpose double-ended queue operations

Important Methods​

MethodDescription
addFirst(E e)Inserts element at front
addLast(E e)Inserts element at end
offerFirst(E e)Inserts element at front
offerLast(E e)Inserts element at end
peekFirst()Retrieves first element
peekLast()Retrieves last element
pollFirst()Removes first element
pollLast()Removes last element
push(E e)Stack push (adds to front)
pop()Stack pop (removes from front)

Example 1: Using ArrayDeque as Queue​

import java.util.ArrayDeque;
import java.util.Deque;

public class ArrayDequeQueueExample {

public static void main(String[] args) {

Deque<String> queue = new ArrayDeque<>();

queue.offer("Alice");
queue.offer("Bob");
queue.offer("Charlie");

System.out.println(queue);

System.out.println(queue.poll());
System.out.println(queue.poll());

System.out.println(queue);

}
}

Output

[Alice, Bob, Charlie] Alice Bob [Charlie]


Example 2: Using ArrayDeque as Stack​

import java.util.ArrayDeque;
import java.util.Deque;

public class ArrayDequeStackExample {

public static void main(String[] args) {

Deque<Integer> stack = new ArrayDeque<>();

stack.push(10);
stack.push(20);
stack.push(30);

System.out.println(stack);

System.out.println(stack.pop());
System.out.println(stack.pop());

System.out.println(stack);

}
}

Output

[30, 20, 10] 30 20 [10]


Example 3: Double Ended Operations​

import java.util.ArrayDeque;
import java.util.Deque;

public class ArrayDequeDequeExample {

public static void main(String[] args) {

Deque<String> deque = new ArrayDeque<>();

deque.addFirst("Task 1");
deque.addLast("Task 2");
deque.addFirst("Task 0");

System.out.println(deque);

System.out.println(deque.peekFirst());
System.out.println(deque.peekLast());

deque.pollFirst();
deque.pollLast();

System.out.println(deque);

}
}

Performance Characteristics​

OperationComplexity
addFirst/addLastO(1)
pollFirst/pollLastO(1)
push/popO(1)
iterationO(n)

ArrayDeque is usually faster than LinkedList because it avoids node allocations.


When to Use ArrayDeque​

Use when:

  • Implementing stack
  • Implementing queue
  • Need fast double-ended operations
  • High-performance deque operations

Avoid when:

  • Random access is required
  • Frequent middle insertions are needed

Comparison: ArrayDeque vs LinkedList​

FeatureArrayDequeLinkedList
Data StructureResizable ArrayDoubly Linked List
PerformanceFasterSlightly slower
Memory UsageLowerHigher
Random AccessNot supportedNot efficient (O(n))